#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 50003
int L, N, M, D;
int dis[maxn];
bool judge(int distance)
{
    int cnt = 0;
    for (int i = 1, now = 0; i < N + 1; ++i)
    {
        if (dis[i] - dis[now] < distance)
        {
            //当前的距离小于我们期望的最短跳跃距离
            cnt++; //把第i块石头拿走,考虑下一块
        }
        else
            now = i; //如果大于等于则直接跳过去,我们考虑下一块
    }
    return cnt <= M;
}
int main()
{
    scanf("%d%d%d", &L, &N, &M);
    for (int i = 1; i <= N; ++i)
    {
        scanf("%d", &dis[i]);
    }
    dis[N + 1] = L;
    //要使得最短跳跃距离最大
    //对可能的答案区间进行二分查找
    int l = 1, r = L, mid, ans;
    while (l <= r)
    {
        mid = (l + r) / 2;
        if (judge(mid) == true)
        {
            ans = mid;
            l = mid + 1;
        }
        else
            r = mid - 1;
    }
    printf("%d", ans);
    return 0;
}